#ifndef PROJECTILES_H
#   define PROJECTILES_H



/**
 * \struct projectile projectiles.h
 * Permet de tout savoir sur un projectile durant une bataille
 * Liste doublement chainee non-circulaire
 */
struct projectile
{
    /**
     * L'id est la position du projectile dans le tableau de la base_donnee
     * qui contient la description de tous les projectiles
     */
    unsigned char id;
    unsigned int coord_x;
    unsigned int coord_y;
    /**
     * l'orientation permet de savoir vers ou est tourne le projectile.
     * Utiliser pour cela les caracteres 'h', 'g', 'd', 'b'
     */
    char orientation;
    /** VRAI si lance par le joueur, FAUX sinon */
    char allier;
    /**
     * la puissance d'un projectile est celle de celui qui l'a lance. Sans ce
     * champ, il serait impossible de connaitre la puissance d'un projectile
     * dont le lanceur a ete vaincu (puisque les ennemis vaincus sont retires
     * de la liste d'ennemis contenue par la structure etat_bataille)
     */
    unsigned int puissance;
    unsigned int score_deplacement;
    struct projectile* suiv;
    struct projectile* prec;
};




/**
 * \struct liste_projectiles projectiles.h
 * Liste chainee contenant les projectiles en cours de vol lors d'une bataille
 */
struct liste_projectiles
{
    struct projectile* prem;
};






/**
 * \fn void init_liste_projectiles(struct liste_projectiles*)
 * \brief Prepare une liste_projectiles a etre remplie
 *
 * \param[out] liste L'adresse de la liste a initialiser
 */
void init_liste_projectiles(struct liste_projectiles* liste);



/**
 * \fn void ajouter_projectile(struct liste_projectiles* liste, const unsigned int id,
                               const unsigned int puissance, const char orientation,
                               const unsigned int coord_x, const unsigned int coord_y,
                               const char allier)
 * \brief Ajoute un projectile dans une liste_projectiles et l'initialise
 *
 * \param[in,out] liste Un pointeur vers la liste a modifier
 * \param[in] id L'id du projectile a ajouter
 * \param[in] puissance La puissance attribuee au projectile
 * \param[in] orientation L'orientation qu'aura le projectile
 * \param[in] coord_x Coordonnee horizontale d'apparition
 * \param[in] coord_y Coordonnee verticale d'apparition
 * \param[in] allier VRAI si le projectile est lance par le joueur, FAUX sinon
 */
void ajouter_projectile(struct liste_projectiles* liste, const unsigned int id,
                        const unsigned int puissance, const char orientation,
                        const unsigned int coord_x, const unsigned int coord_y,
                        const char allier);





/**
 * \fn void supprimer_projectile(struct liste_projectiles* liste, struct projectile* proj)
 * \brief Supprime le projectile dont l'adresse est passee en parametre
 *
 * \param[in,out] liste Un pointeur vers la liste a modifier
 * \param[in] proj L'adresse du projectile a supprimer
 * \warning Cette fonction tourne indefiniment si on lui envoie
une adresse erronee ! Veillez a donner l'adresse d'un element
de la liste
 */
void supprimer_projectile(struct liste_projectiles* liste, struct projectile* proj);


/**
 * \fn void detruire_liste_projectiles(struct liste_projectiles* liste)
 * \brief Vide une liste_projectiles en liberant toute la memoire
qui lui avait ete allouee
 *
 * \param liste La liste a detruire
 */
void detruire_liste_projectiles(struct liste_projectiles* liste);






#endif /* PROJECTILES_H */
